package room

import (
	"fmt"
	"log"
	"sync"
)

// Pool
// 房间管理器（房间池）
// 管理房间创建、销毁
type Pool struct {
	rooms sync.Map
	New   func(roomId string) Room
}

// Get
// 获取一个房间信息
func (p *Pool) Get(roomId string) Room {
	//	搜索房间，判定房间是否已被创建
	//	如果已被创建则返回当前房间
	if room := p.Search(roomId); room != nil {
		return room
	}

	//	如果房间未被创建则创建一个放那关键
	room := p.New(roomId)
	p.rooms.Store(roomId, room)

	return room
}

// Search
// 搜索房间信息
// 如果房间未被找到则返回 nil
func (p *Pool) Search(roomId string) Room {
	v, ok := p.rooms.Load(roomId)
	if !ok {
		return nil
	}

	return v.(Room)
}

// Destroy
// 销毁房间
func (p *Pool) Destroy(room Room) {
	//	当房间内玩家的数据为0时，应当销毁该房间
	if len(room.Players()) == 0 {
		//	从池中删除当前的房间
		p.rooms.Delete(room.RoomId())
		log.Printf("[ROOM_POOL] 房间 %s 已销毁\n", room.RoomId())
	}

	fmt.Printf("DESTROY_LEN: %d\n", len(room.Players()))
}
